package com.buddy.design.pattern._08adapter;

import com.buddy.design.pattern._08adapter.loginadapter.IPassportForThird;
import com.buddy.design.pattern._08adapter.loginadapter.PassportForThirdAdapter;
import com.buddy.design.pattern._08adapter.loginadapter.ResultMsg;
import com.buddy.design.pattern._08adapter.poweradapter.AC220;
import com.buddy.design.pattern._08adapter.poweradapter.DC5;
import com.buddy.design.pattern._08adapter.poweradapter.PowerAdapter;
import org.junit.Test;

public class AdapterPattern {

    /*
     *  适配器模式：
     *      将一个类的接口转换为另一个接口，使原本的接口不兼容的类可以一起工作。
     *      属于结构型设计模式
     *
     *   适用场景：
     *      已经存在的类，它的方法和需求不匹配（方法结果相同或相似）的情况；
     *      适配器模式不是软件设计阶段考虑的设计模式，是随着软件的维护由于不同产品，
     *      不同厂家造成功能类似而接口不相同的情况下的解决方案
     *
     *    AdvisorAdapter
     *      support方法判断兼容问题
     *    HandlerAdapter
     *
     *    AbstractHandlerMethodAdapter
     *      supports方法
     *
     *   优点：
     *      能提高类的透明性和复用性，现有类的复用但不需要改变；
     *      目标类和适配器类解耦，提高程序的扩展性；
     *      在很多业务场景中符合开闭原则
     *   缺点：
     *      编写过程中要全面考虑，可能会增加系统的复杂性；
     *      增加代码阅读难度，降低代码可读性，过多使用适配器会使系统代码变得凌乱
     */

    @Test
    public void powerTest() {
        DC5 dc5 = new PowerAdapter(new AC220());
        dc5.outputDC5V();
    }

    @Test
    public void loginTest() {
        IPassportForThird iPassportForThird = new PassportForThirdAdapter();
        ResultMsg resultMsg = iPassportForThird.loginForQQ("123");
        System.out.println(resultMsg.toString());
        resultMsg = iPassportForThird.loginForWeChart("1111");
        System.out.println(resultMsg.toString());
    }
}
